home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / t_os / border / source / dabe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-19  |  43.3 KB  |  1,829 lines

  1. #include    <egb.h>
  2. #include    <fmc.h>
  3. #include    <stdio.h>
  4. #include    <stdlib.h>
  5. #include    <string.h>
  6. #include    <math.h>
  7. #include    <mos.h>
  8. #include    <snd.h>
  9. #include    "oaklib.h"
  10. #include    "cons.h"
  11. #include    "dabe.h"
  12.  
  13.  
  14. char    sndwork[16384];
  15. char    work[1536];
  16. char    swork[1024];
  17. char    mwork[4096];
  18. char    fwork[8192];
  19. char    para[4096];
  20. char    komdata[6][512];    
  21. short    komsize;
  22. short    cardsize;
  23. char    mosread_data[25][70];
  24. char    carddata[6][1024];
  25. short    datalen[1000];        
  26. short    soundflag;
  27. short    putxsize; 
  28. short    putysize;
  29. char    fenv[64];
  30. char    drive[4];
  31. char    path[32];
  32.  
  33. int        ox = 600, oy = 20;
  34. int        event1_x, event1_y;
  35. int        event2_x, event2_y;
  36. int        event3_x, event3_y;
  37. int        botton_x = 37 * 16, botton_y[12];    
  38. short    putcard_line[6];
  39. short    INS_STAT = OFF;        
  40.  
  41. void    main()
  42. {    
  43.     init();
  44.     main2();
  45. }
  46.  
  47.  
  48. void    main2()
  49. {
  50.     while(1){
  51.         switch(start()){
  52.             case 1: look();
  53.                     break;
  54.             case 2: fshinki();
  55.                     break;
  56.             case 3: fsakujyo();
  57.                     break;
  58.             case 4: getdrive();
  59.                     break;
  60.             case 5:    getpath();
  61.                     break;
  62.             case 6: end();
  63.                     break;
  64.             default:
  65.                     break;
  66.         }
  67.     }
  68. }
  69.  
  70. short        start()
  71. {
  72.     short        ret;
  73.     char    msg[7][22] =  {"Menu", "データファイル閲覧", "データファイル作成", 
  74.                            "データファイル削除", "ドライブ変更", "パス変更", "GoodBye"};
  75.     
  76.     ret = MOS_read(3, 3.5, 6, msg[0], 22, page0, NEW );
  77.  
  78.     return  ret;
  79. }
  80.  
  81. void    getdrive()
  82. {
  83.     FILE    *fp;
  84.     char    msg[19][18] = {"","A","B","C","D","E","F","G",
  85.                            "H","I","J","K","L","M","N","O","P","Q",
  86.                            "R"};
  87.     char    drv[18][3] = {"a:","b:","c:","d:","e:","f:","g:","h:","i:","j:",
  88.                           "k:","l:","m:","n:","o:","p:","q:","r:"};
  89.     short        drvnum;
  90.     short        ret;
  91.                            
  92.     drvnum = 0;     
  93.     while( ( drvnum <= 17 ) && ( strcmp( drive, drv[drvnum] ) != 0 ) )
  94.          drvnum++;
  95.     strcpy( msg[ 0 ], "現在のドライブ:" );
  96.     strcat( msg[ 0 ], msg[ drvnum + 1 ] );
  97.     
  98.     ret = MOS_read(6, 1.5, 18, msg[ 0 ], 18, page0, NEW );
  99.  
  100.     if( ret > 0 )
  101.         strcpy( drive, drv[ ret - 1 ] );
  102.     else {
  103.         strcpy( swork, "ドライブは" );
  104.         strcat( swork, msg[ drvnum + 1 ] );
  105.         strcat( swork, "のままです" );
  106.         putmessage( swork );
  107.         return;
  108.     }
  109.         
  110.     if( ( fp = fopen( fenv, "w" ) ) != NULL ){
  111.         fputx( drive, fp );
  112.         fputx( path, fp );
  113.         fclose( fp );
  114.         strcpy( swork, "ドライブを" );
  115.         drvnum = 0;     
  116.         while( ( drvnum <= 17 ) && ( strcmp( drive, drv[drvnum] ) != 0 ) )
  117.              drvnum++;
  118.         strcat( swork, msg[ drvnum + 1 ] );
  119.         strcat( swork, "に変更しました" );
  120.         putmessage( swork );
  121.     } else 
  122.         puterror( "変更ドライブのファイル保存に失敗しました" ); 
  123. }
  124.  
  125. void    getpath()
  126. {    
  127.     char    pathname[64];
  128.     FILE    *fp;
  129.     short    oakret;
  130.             
  131.     strcpy( swork, "現在のパス名:" );
  132.     strcat( swork, path );
  133.     g_wintitle(6, 31, 8,  TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  134.     g_winbox(6, 9, 31, 13,  BOXCOL, UBXCOL, DBXCOL);
  135.     g_put_endicn( 7, 11.5 );
  136.     strcpy(swork, "パス名");
  137.     g_putchr(7, 10, CHRCOL, swork);
  138.     
  139.     /*  パス名の入力  */
  140.     oakret = oakn(11, 10, 30, 1, pathname);
  141.     
  142.     if( oakret == BREAK ){
  143.         g_rput_endicn( 7, 11.5 );
  144.         putmessage( "パス名変更を中止します" );
  145.         return;
  146.     }
  147.     
  148.     if( strlen( pathname ) > 0 ){
  149.         if( *(pathname + 0) == 0x5C )
  150.             strcpy( path, pathname );
  151.         else {
  152.             strcpy( swork, "パス名は¥から入力してください" );
  153.             puterror( swork );
  154.             return;
  155.         }
  156.     } else {
  157.         strcpy( swork, "パス名は" );
  158.         strcat( swork, path );
  159.         strcat( swork, "のままです" );
  160.         putmessage( swork );
  161.  
  162.         return;    
  163.     }
  164.     
  165.     if( ( fp = fopen( fenv, "w" ) ) != NULL ){
  166.         fputx( drive, fp );
  167.         fputx( path, fp );
  168.         fclose( fp );
  169.         strcpy( swork, "パス名を" );
  170.         strcat( swork, path );
  171.         strcat( swork, "に変更しました" );
  172.         putmessage( swork );
  173.     } else
  174.         puterror( "変更パス名のファイル保存に失敗しました" ); 
  175.     
  176. }
  177.  
  178. void    look()
  179. {
  180.     char    filename[128];
  181.     
  182.     char    *pkn;
  183.     
  184.     char    *pcd;
  185.     
  186.     char    *ppd;
  187.     
  188.     short    pagenum;
  189.     short    readnum;
  190.     short    cardnum;
  191.     
  192.     long    offset;
  193.     
  194.     short    i, j, k, ret, start;
  195.     FILE    *fp;
  196.     short    putflag;
  197.     short    mosreadflag;
  198.     short    kanflag;
  199.     
  200.     datalen[0] = 0;
  201.     
  202.       /* ファイルの選択 */
  203.     
  204.     strcpy( filename, selfile() );
  205.     if( strcmp( filename, "データファイル名") == 0 ){
  206.         putmessage( "データファイル閲覧を中止します" );
  207.         return;
  208.     }
  209.     
  210.       /* 項目名の読み込み */
  211.     
  212.     komsize = 0;
  213.     if( ( fp = fopen_kom(filename, "r") ) != NULL ){
  214.         while( fgetx(komdata[komsize], 256, fp ) != NULL )
  215.             komsize++;
  216.         fclose( fp );
  217.     } else {
  218.         puterror( "項目ファイルのオープンに失敗しました" );
  219.         MOS_loop();
  220.         return;
  221.     }
  222.     
  223.       /* 一覧表示する時の一つの項目データの長さを計算 */
  224.     
  225.     putxsize = floor( ( 69 -  (komsize -  1) * 2 ) / komsize );
  226.     putysize = floor( 24 / komsize );
  227.     
  228.     for( i = 0; i < komsize; i++ ){
  229.         botton_y[ i * 2 ] = ( 3 + putysize * i ) * 16;
  230.         botton_y[ i * 2 + 1 ] = ( 3 + putysize * i + 1.5 ) * 16;
  231.     } 
  232.     for( i = komsize; i < 6; i++ ){
  233.         botton_y[ i * 2 ] = -100;
  234.         botton_y[ i * 2 + 1 ] = -100;
  235.     }
  236.     
  237.               
  238.       /* 表示データ(項目名)の構築 */
  239.       
  240.     ppd = &mosread_data[ 0 ][ 0 ];
  241.     for( i = 1; i <= komsize; i++ ){ 
  242.         pkn = &komdata[ i - 1 ][ 0 ];
  243.         kanflag = OFF;
  244.         for( j = 1; j <= putxsize; j++ ){
  245.             if( kanflag == ON )
  246.                 kanflag = OFF;
  247.             else{
  248.                 if( iskanji( *pkn ) )
  249.                     kanflag = ON;
  250.             }
  251.             if( *pkn != ( char )0x00 )
  252.                 *ppd++ = *pkn++;
  253.             else    
  254.                 *ppd++ = ( char )0x20;
  255.         }
  256.         if( kanflag == ON )
  257.             *(ppd - 1)= ( char )0x20;
  258.         *ppd++ = ( char )0x20;
  259.         *ppd++ = ( char )0x20;
  260.     }
  261.     *( mosread_data[ 0 ] + 69 ) = ( char )0x00;
  262.     
  263.     
  264.     cardsize = 0;
  265.     if( ( fp = fopen_crd( filename, "r" ) ) != NULL ){
  266.         putmessage( "データ読み込み中" );
  267.         while( fgetx( fwork, 8192, fp ) != NULL ){
  268.             cardsize++;
  269.             datalen[ cardsize ] = strlen( fwork ) + 2;
  270.         }
  271.         fclose( fp );
  272.     } else {
  273.         puterror( "データファイルのオープンに失敗しました" );
  274.         MOS_loop();
  275.         putmessage( "新規作成の場合はデータを一件追加してください" );
  276.         MOS_loop();
  277.         putmessage( "データを追加しますか?" );
  278.         if( MOS_YesNo() == 1 )
  279.             dtuika(filename);
  280.         return;
  281.     }
  282.     
  283.     
  284.     start:
  285.     
  286.     if( ( fp = fopen_crd( filename, "r" ) ) != NULL ){
  287.         
  288.         pagenum = 1;
  289.         putflag = ON;
  290.         mosreadflag = SAVE;
  291.         
  292.         while(1){
  293.             
  294.             if( mosreadflag == SAVE ){    
  295.                 if( pagenum <= 1 )
  296.                     start = 1;
  297.                 else{
  298.                     start = 2;
  299.                     strcpy( mosread_data[1],  "前のページへ" );
  300.                 }
  301.             
  302.                 for( readnum = start; ( fgetx( fwork, 8192, fp ) != NULL ) && ( readnum <= 23 ); readnum++ ){
  303.                 
  304.                     pcd = &fwork[ 0 ];
  305.                     pcd++;
  306.                     ppd = &mosread_data[ readnum ][ 0 ];
  307.                     for( j = 1; j <= komsize; j++ ){
  308.                         kanflag = OFF;
  309.                         for( k = 1; k <= putxsize; k++ ){ 
  310.                             if( kanflag == ON )
  311.                                 kanflag = OFF;
  312.                             else{
  313.                                 if( iskanji( *pcd ) )
  314.                                     kanflag = ON;
  315.                             }
  316.                             if( *pcd != ( char )0x22 )
  317.                                 *ppd++ = *pcd++;
  318.                             else    
  319.                                 *ppd++ = ( char )0x20;
  320.                         }
  321.                         if( kanflag == ON )
  322.                             *(ppd - 1)= ( char )0x20;
  323.                         *ppd++ = ( char )0x20;
  324.                         *ppd++ = ( char )0x20;
  325.                         if( j < komsize ){
  326.                             while( *pcd != ( char )0x22 )
  327.                                 pcd++;
  328.                             pcd += 3;        
  329.                         }
  330.                     }    
  331.                     *( mosread_data[ readnum ] + 69 ) = ( char )0x00;
  332.                 }
  333.             
  334.                 if(--readnum >= 23)
  335.                      if(feof(fp) == 0){
  336.                         strcpy(mosread_data[24],  "次のページへ");
  337.                          readnum++;
  338.                     }                          
  339.                         
  340.                 maketitle( filename, swork, "・一覧モード" );
  341.                 g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  342.                 g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  343.             }
  344.             
  345.             if( readnum > 0 )    
  346.                 ret = MOS_read(2, 4, readnum, mosread_data[0], 70, page0, mosreadflag );
  347.             else {
  348.                 puterror( "データが一件もありません" );
  349.                 MOS_loop();
  350.                 putmessage( "データを追加しますか?" );
  351.                    if( MOS_YesNo() == 1 ){
  352.                     dtuika(filename);
  353.                     fclose( fp );
  354.                      goto start;
  355.                 } else
  356.                     return;
  357.             }
  358.             
  359.             if( ret == Rbotton ){
  360.                 ret = selmode( fp, filename );
  361.                 switch( ret ){
  362.                     case Rbotton:    mosreadflag = RESTART;
  363.                                     break;
  364.                     case 3:        fclose( fp );
  365.                                 putmessage( "データ閲覧を終了します" );                
  366.                                 return;
  367.                     default:    mosreadflag = SAVE;
  368.                                 break;
  369.                 }          
  370.             }else{
  371.                 if((ret == 24) || ((ret == 1) && (pagenum > 1))){
  372.                     if(ret == 24)
  373.                         pagenum++;
  374.                     else
  375.                         pagenum--;
  376.                     mosreadflag = SAVE;
  377.                 }else{
  378.                     
  379.                     if(pagenum <= 1){
  380.                         cardnum = ret;
  381.                     }else{
  382.                         cardnum = 23;
  383.                         for(i = 3; i <= pagenum; i++)
  384.                             cardnum += 22;
  385.                         cardnum += ret - 1;
  386.                     }
  387.                     
  388.                     maketitle( filename, swork, "・No." );
  389.                     makeNo( cardnum, swork );
  390.                     g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  391.                     
  392.                     ret = Rbotton;
  393.                     putflag = ON;
  394.                     
  395.                     while( ret != END ){    
  396.                         
  397.                         if( putflag == ON ){    
  398.                             
  399.                             offset = 0;
  400.                             for(i = 0; i < cardnum; i++)
  401.                                 offset += datalen[i];
  402.                             fseek(fp, offset, SEEK_SET); 
  403.             
  404.                             /* 表示メッセージの構築 */
  405.                 
  406.                             if(fgetx(fwork, 8192, fp) != NULL){
  407.                                 pcd = &fwork[0];
  408.                                 pcd++;
  409.                                 for(i = 1; i <= komsize; i++){
  410.                                     ppd = &carddata[i - 1][0];
  411.                                     while(*pcd != (char)0x22)
  412.                                         *ppd++ = *pcd++;
  413.                                     *ppd = (char)0x00;
  414.                                     pcd += 3;
  415.                                 }
  416.                             } else {
  417.                                 puterror( "データが見当たりません" );
  418.                                 MOS_loop();
  419.                                 return;
  420.                             }
  421.             
  422.                             /* データの表示 */
  423.             
  424.                             g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  425.                             g_put_nexticn( 2, 26 );
  426.                             g_put_backicn( 4.5, 26 );
  427.                     
  428.                             maketitle( filename, swork, "・No." );
  429.                             makeNo( cardnum, swork );
  430.                             g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_OFF );
  431.                             
  432.                             for(i = 1; i <= komsize; i++){
  433.                                 put_komdata( &komdata[i - 1][0], i );
  434.                                 put_carddata( &carddata[i - 1][0], i );
  435.                                 g_putbotton( i );
  436.                                 putcard_line[ i - 1 ] = 1;
  437.                             }
  438.                         }
  439.                         
  440.                         mos_start();
  441.                         while( (ret = mos_sub()) == 0 );
  442.                         mos_end();
  443.                     
  444.                         switch(ret){
  445.                             case    2:     g_rput_nexticn( 2, 26 );
  446.                                         if( ++cardnum > cardsize ){
  447.                                              g_put_nexticn( 2, 26 );
  448.                                             cardnum = cardsize;
  449.                                             putflag = OFF;
  450.                                         } else
  451.                                             putflag = ON;
  452.                                         break;
  453.                             case    3:    g_rput_backicn( 4.5, 26 );
  454.                                         if( --cardnum < 1 ){
  455.                                         g_put_backicn( 4.5, 26 );
  456.                                             cardnum = 1;                
  457.                                             putflag = OFF;
  458.                                         } else
  459.                                             putflag = ON;
  460.                                         break;
  461.                             case Rbotton:    ret = selmode2( fp, &filename[0], cardnum );
  462.                                             switch( ret ){
  463.                                                 case Rbotton:    putflag = OFF;
  464.                                                                 break;
  465.                                                 case    1:    cardnum = cardsize;
  466.                                                             putflag = ON;
  467.                                                             break;
  468.                                                 default     :    putflag = ON;
  469.                                                             break;
  470.                                             }
  471.                                             if( ret == 3 || ret == 4 )
  472.                                                 ret = END;
  473.                                             else
  474.                                                 ret = Rbotton;
  475.                                             break;
  476.                             case 11..22:put_roll_carddata( ret - 10 );
  477.                                         putflag = OFF;
  478.                                         break;                    
  479.                             default:
  480.                                         break;
  481.                         }
  482.                     
  483.                     }
  484.                 mosreadflag = SAVE;
  485.                 }
  486.             }
  487.             
  488.             /* ファイルのシーク */
  489.             if(pagenum <= 1)
  490.                 cardnum = 0;
  491.             else{
  492.                 cardnum = 24;
  493.                 for(i = 3; i <= pagenum; i++)
  494.                     cardnum += 22;
  495.             }
  496.             
  497.             offset = 0;
  498.             for(i = 0; i < cardnum; i++)
  499.                 offset += datalen[i];
  500.             fseek(fp, offset, SEEK_SET); 
  501.         }
  502.     } else {
  503.         puterror( "データファイルのオープンに失敗しました" );
  504.         return;
  505.     }
  506. }
  507.  
  508. void    dkensaku( char *filename )
  509. {
  510.     char    search[6][1024];
  511.     char    *psd;
  512.     short    searlen;
  513.     short    skomnum;
  514.     short    ekomnum;
  515.     short    searchnum[500];
  516.     short    searsize;
  517.     char    *pfcd;
  518.     char    *pcd;
  519.     short    cardlen;
  520.     short    cardnum;
  521.     short    i, j, k;
  522.     FILE    *fp;
  523.     short    ret;
  524.     short    offset;
  525.     short    start;
  526.     short    pagenum;
  527.     short    readnum;
  528.     char    *ppd;
  529.     short    oakret = 0;
  530.     short    putflag;
  531.     short    kanflag;
  532.     short    mosreadflag;
  533.     
  534.       
  535.       /* タイトルの表示 */
  536.     maketitle( filename, swork, "・検索モード" );
  537.     g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  538.     
  539.     strcpy( swork, "検索データの入力" );
  540.     g_wintitle( 5, 35, 5, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  541.     g_winbox(5, 6, 35, 20, BOXCOL, UBXCOL, DBXCOL);
  542.     g_put_endicn( 6, 18.5 );
  543.  
  544.     for(i = 1; i <= komsize; i++)
  545.         g_putchr2(6, 7 + 2 * (i - 1), CHRCOL, komdata[i - 1], 12 );
  546.     
  547.  
  548.     for( i = 0; i <= (komsize - 1) && (oakret == THRU); i++ ){
  549.         oakret = oakn( 13, (7 + i * 2), 34, 1, search[ i ] );
  550.         g_boxfill( 13, ( 7 + i * 2 ) - 0.5, 34, ( ( 7 + i * 2 ) + 1.5 ), BOXCOL ); 
  551.         g_putchr2( 13, (7 + i * 2), CHRCOL, search[ i ], 46 );
  552.     }
  553.     if( oakret == BREAK ){
  554.         g_rput_endicn( 6, 18.5 );
  555.         putmessage( "データ検索を中止します" );
  556.         MOS_loop();
  557.         return;
  558.     }
  559.  
  560.     skomnum = 0;
  561.     for( i = 0; i <= ( komsize - 1 ); i++ )
  562.         if( strlen( search[ i ] ) > 0)
  563.             skomnum++;    
  564.                                                 
  565.     if( skomnum == 0 ){    
  566.         puterror( "検索データが入力されませんでした" );
  567.         MOS_loop();
  568.         return;
  569.     }
  570.     
  571.     if( ( fp = fopen_crd( filename, "r" ) ) != NULL ){
  572.         cardnum = 1;
  573.         searsize = 0;
  574.         putmessage( "検索中" );
  575.         while( fgetx( fwork, 8192, fp ) != NULL ){
  576.             datalen[ cardnum ] = strlen( fwork ) + 2;
  577.             pfcd = &fwork[0];
  578.             pfcd++;
  579.             for( i = 1; i <= komsize; i++ ){
  580.                 pcd = &carddata[i - 1][0];
  581.                 while( *pfcd != (char)0x22 ){
  582.                     *pcd = *pfcd;
  583.                     pcd++;
  584.                     pfcd++;
  585.                 }
  586.                 *pcd = (char)0x00;
  587.                 pfcd += 3;
  588.             }
  589.             ekomnum = 0;
  590.             for( i = 1; i <= komsize; i++ ){
  591.                 if( ( searlen = strlen( &search[i - 1] ) ) > 0 ){
  592.                     cardlen = strlen( carddata[i - 1] );
  593.                     if( cardlen >= searlen ){    
  594.                         for( j = 0; j <= ( cardlen - searlen ); j++ ){    
  595.                             psd = &search[i - 1][0];
  596.                             pcd = &carddata[i - 1][j];
  597.                             while( ( *psd == *pcd ) && ( *psd != (char)0x00 ) ){
  598.                                 psd++;
  599.                                 pcd++;
  600.                             }
  601.                             if( *psd == (char)0x00 ){
  602.                                 ekomnum++;
  603.                                 break;
  604.                             }                                     
  605.                         }
  606.                     }
  607.                 }
  608.             }
  609.             if( skomnum == ekomnum ){
  610.                 searchnum[searsize] = cardnum;
  611.                 searsize++;
  612.             }
  613.             cardnum++;
  614.         } 
  615.         fclose( fp );
  616.     } else {
  617.         puterror( "データファイルのオープンに失敗しました" );
  618.         MOS_loop();
  619.         return;
  620.     }
  621.  
  622.     if( searsize == 0 ){
  623.         putmessage( "検索一致データは0件です" );
  624.         MOS_loop();
  625.         return;
  626.     } else
  627.         putmessage( "検索成功" );
  628.     
  629.  
  630.  
  631.     if( ( fp = fopen_crd( filename, "r" ) ) != NULL ){
  632.         
  633.         pagenum = 1;
  634.         cardnum = 0;
  635.         putflag = ON;
  636.         mosreadflag = SAVE;
  637.             
  638.         while(1){
  639.             
  640.             if( mosreadflag == SAVE ){    
  641.             
  642.                 if( pagenum <= 1 )
  643.                     start = 1;
  644.                 else{
  645.                     start = 2;
  646.                     strcpy( mosread_data[1],  "前のページへ" );
  647.                 }
  648.             
  649.                 for( readnum = start; ( cardnum < searsize ) && ( readnum <= 23 ) ; readnum++ ){
  650.                 
  651.                     cardnum++;
  652.                 
  653.                     offset = 0;
  654.                     for( i = 0; i < searchnum[ cardnum - 1 ]; i++ )
  655.                         offset += datalen[ i ];
  656.                     fseek( fp, offset, SEEK_SET ); 
  657.             
  658.                     if( fgetx( fwork, 8192, fp ) != NULL ){
  659.                     
  660.                         pfcd = &fwork[ 0 ];
  661.                         pfcd++;
  662.                         ppd = &mosread_data[ readnum ][ 0 ];
  663.                         for( j = 1; j <= komsize; j++ ){
  664.                             kanflag = OFF;
  665.                             for( k = 1; k <= putxsize; k++ ){ 
  666.                                 if( kanflag == ON )
  667.                                     kanflag = OFF;
  668.                                 else{
  669.                                     if( iskanji( *pfcd ) )
  670.                                         kanflag = ON;
  671.                                 }
  672.                                 if( *pfcd != ( char )0x22 )
  673.                                     *ppd++ = *pfcd++;
  674.                                 else    
  675.                                     *ppd++ = ( char )0x20;
  676.                             }
  677.                             if( kanflag == ON )
  678.                                 *(ppd - 1)= ( char )0x20;
  679.                             *ppd++ = ( char )0x20;
  680.                             *ppd++ = ( char )0x20;
  681.                             if( j < komsize ){
  682.                                 while( *pfcd != ( char )0x22 )
  683.                                     pfcd++;
  684.                                 pfcd += 3;        
  685.                             }
  686.                         }    
  687.                         *( mosread_data[ readnum ] + 69 ) = ( char )0x00;
  688.                     } else {
  689.                         puterror( "データが読み込めません" );
  690.                          MOS_loop();
  691.                          return;
  692.                      }
  693.                 }
  694.             
  695.                 if(--readnum >= 23)
  696.                      if( cardnum < searsize ){
  697.                         strcpy(mosread_data[24],  "次のページへ");
  698.                          readnum++;
  699.                     }                          
  700.                 maketitle( filename, swork, "・検索モード" );
  701.                 g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  702.                 g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  703.             }
  704.             
  705.             if( readnum > 0 ) 
  706.                 ret = MOS_read(2, 4, readnum, mosread_data[0], 70, page0, mosreadflag );
  707.             else {
  708.                 puterror( "検索一致データが無くなりました" );
  709.                 MOS_loop();
  710.                 return;
  711.             }
  712.             
  713.             if( ret == Rbotton ){
  714.                 ret = selmode_k( fp, filename, searsize, searchnum );
  715.                 switch( ret ){
  716.                     case 1:        mosreadflag = SAVE;
  717.                                 break;
  718.                     case 2:        putmessage( "検索モードを終了します" );
  719.                                 return;                
  720.                     default:    mosreadflag = RESTART;
  721.                                 break;
  722.                 }          
  723.             }else{
  724.                 if((ret == 24) || ((ret == 1) && (pagenum > 1))){
  725.                     if(ret == 24)
  726.                         pagenum++;
  727.                     else
  728.                         pagenum--;
  729.                     mosreadflag = SAVE;
  730.                 }else{
  731.                     
  732.                     if(pagenum <= 1){
  733.                         cardnum = ret;
  734.                     }else{
  735.                         cardnum = 23;
  736.                         for(i = 3; i <= pagenum; i++)
  737.                             cardnum += 22;
  738.                         cardnum += ret - 1;
  739.                     }
  740.                     
  741.                     maketitle( filename, swork, "・No." );
  742.                     makeNo( searchnum[ cardnum - 1 ], swork );
  743.                     strcat( swork, "-検索モード" );
  744.                     g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  745.                     
  746.                     ret = Rbotton;
  747.                     putflag = ON;
  748.                     
  749.                     while( ret != END ){
  750.                         
  751.                         if( putflag == ON ){    
  752.                     
  753.                             offset = 0;
  754.                             for(i = 0; i < searchnum[cardnum - 1]; i++)
  755.                                 offset += datalen[i];
  756.                             fseek(fp, offset, SEEK_SET); 
  757.             
  758.                             /* 表示メッセージの構築 */
  759.             
  760.                             if( fgetx( fwork, 8192, fp ) != NULL ){
  761.                                 pfcd = &fwork[0];
  762.                                 pfcd++;
  763.                                 for(i = 1; i <= komsize; i++){
  764.                                     ppd = &carddata[i - 1][0];
  765.                                     while(*pfcd != (char)0x22)
  766.                                         *ppd++ = *pfcd++;
  767.                                     *ppd = (char)0x00;
  768.                                     pfcd += 3;
  769.                                 }
  770.                             } else {
  771.                                 puterror( "データが見当たりません" );
  772.                                 MOS_loop();
  773.                                 return;
  774.                             }
  775.             
  776.                             /* データの表示 */
  777.             
  778.                             g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  779.                             g_put_nexticn( 2, 26 );
  780.                             g_put_backicn( 4.5, 26 );
  781.                     
  782.                             maketitle( filename, swork, "・No." );
  783.                             makeNo( searchnum[ cardnum - 1 ], swork );
  784.                             strcat( swork, " - 検索モード" );
  785.                             g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_OFF );
  786.                             
  787.                             for(i = 1; i <= komsize; i++){
  788.                                 put_komdata( &komdata[i - 1][0], i );
  789.                                 put_carddata( &carddata[i - 1][0], i );
  790.                                 g_putbotton( i );
  791.                                 putcard_line[ i - 1 ] = 1;
  792.                             }
  793.                         }    
  794.                         
  795.                         mos_start();
  796.                         while( (ret = mos_sub()) == 0 );
  797.                         mos_end();
  798.                     
  799.                         switch( ret ){
  800.                             case    2:     g_rput_nexticn( 2, 26 );
  801.                                         if( ++cardnum > searsize ){
  802.                                              g_put_nexticn( 2, 26 );
  803.                                             cardnum = searsize;
  804.                                             putflag = OFF;
  805.                                         } else
  806.                                             putflag = ON;
  807.                                         break;
  808.                             case    3:    g_rput_backicn( 4.5, 26 );
  809.                                         if( --cardnum < 1 ){
  810.                                             g_put_backicn( 4.5, 26 );
  811.                                             cardnum = 1;                
  812.                                             putflag = OFF;
  813.                                         } else
  814.                                             putflag = ON;
  815.                                         break;
  816.                             case Rbotton:  ret = selmode_k2( fp, &filename[0], searchnum[cardnum - 1] );
  817.                                             switch( ret ){
  818.                                                 case Rbotton:    putflag = OFF;
  819.                                                                 break;
  820.                                                 case 1:    offset = 0;
  821.                                                         for(i = 0; i < searchnum[cardnum - 1]; i++)
  822.                                                             offset += datalen[ i ];
  823.                                                         fseek(fp, offset, SEEK_SET); 
  824.                                                         fgetx( fwork, 8192, fp );
  825.                                                         putflag = ON;
  826.                                                         break;
  827.                                                 case 2:    memcpy( &searchnum[cardnum - 1], &searchnum[ cardnum ], (searsize - cardnum) * 2 );
  828.                                                         searsize--;
  829.                                                         for( i = cardnum; i <= searsize; i++ )
  830.                                                             searchnum[i - 1]--;    
  831.                                                         break;
  832.                                                 default:
  833.                                                         break;
  834.                                             }
  835.                                             if( ret == 2 || ret == 3 )
  836.                                                 ret = END;
  837.                                             else
  838.                                                 ret = Rbotton;
  839.                                             break;
  840.                             case 11..22:put_roll_carddata( ret - 10 );
  841.                                         putflag = OFF;
  842.                                         break;                    
  843.                             default:
  844.                                         break;
  845.                         }
  846.                     }
  847.                 mosreadflag = SAVE;
  848.                 }
  849.             }
  850.             
  851.             /* ファイルのシーク */
  852.             if(pagenum <= 1)
  853.                 cardnum = 0;
  854.             else{
  855.                 cardnum = 24;
  856.                 for(i = 3; i <= pagenum; i++)
  857.                     cardnum += 22;
  858.             }
  859.             
  860.             offset = 0;
  861.             for(i = 0; i < searchnum[cardnum - 1]; i++)
  862.                 offset += datalen[i];
  863.             fseek(fp, offset, SEEK_SET); 
  864.         }
  865.         fclose( fp );
  866.     } else {
  867.         puterror( "データファイルのオープンに失敗しました" );
  868.         MOS_loop();
  869.     }
  870. }
  871.  
  872.  
  873. void    make_newfile( char *filename, short searsize, short *searchnum, short *datalen )
  874. {
  875.     char    newfilename[64];
  876.     FILE    *fp;
  877.     FILE    *newfp;
  878.     short    offset;
  879.     short    i, j;
  880.     short     oakret;
  881.     
  882.     g_wintitle( 5, 35, 5, TITCOL, UTICOL, DTICOL, TCHCOL, "別ファイル作成", page0, SOUND_ON );
  883.     g_winbox(5, 6, 35, 10, BOXCOL, UBXCOL, DBXCOL);
  884.     g_put_endicn( 6, 8.5 );
  885.     g_putchr(6, 7, CHRCOL, "新データ名" );
  886.     oakret = oakn( 13, 7, 34, 1, newfilename );
  887.  
  888.     if( oakret == BREAK ){
  889.         g_rput_endicn( 6, 8.5 );
  890.         putmessage( "別ファイル作成を中止します" );
  891.         MOS_loop();
  892.         return;
  893.     }
  894.     
  895.     if( ( fp = fopen_crd( newfilename, "r" ) ) == NULL ){
  896.         
  897.         putmessage( "新ファイル作成中" );
  898.         
  899.         makepath( fwork );
  900.         strcat( fwork, "FILENAME.CRD" );
  901.         if( ( fp = fopen( fwork, "a" ) ) != NULL ){
  902.             fputx( newfilename, fp );
  903.             fclose( fp );
  904.         }else {
  905.             puterror( "新ファイル作成に失敗しました" );
  906.             MOS_loop();
  907.             return;
  908.         }
  909.         
  910.         if( ( ( fp = fopen_kom( filename, "r" ) ) != NULL ) && ( ( newfp = fopen_kom( newfilename, "w" ) ) != NULL ) ){
  911.                 while( fgetx( fwork, 8192, fp ) != NULL )                    
  912.                     fputx( fwork, newfp );
  913.                 fclose( fp );
  914.                 fclose( newfp );
  915.         } else {
  916.             if( fp != NULL )
  917.                 fclose( fp );
  918.             else
  919.                 fclose( newfp );
  920.             puterror( "新ファイル作成に失敗しました" );
  921.             MOS_loop();
  922.             return;
  923.         }    
  924.         
  925.         if( ( ( fp = fopen_crd( filename, "r" ) ) != NULL ) && ( ( newfp = fopen_crd( newfilename, "w" ) ) != NULL ) ){
  926.                 for( i = 1; i <= searsize; i++ ){
  927.                     offset = 0;
  928.                     for( j = 0; j < *searchnum; j++ )
  929.                         offset += *( datalen + j );
  930.                     fseek( fp, offset, SEEK_SET ); 
  931.                     if( fgetx( fwork, 8192, fp ) != NULL ){
  932.                         fputx( fwork, newfp );
  933.                     } else {
  934.                         puterror( "新ファイル作成に失敗しました" );
  935.                         MOS_loop();
  936.                         return;
  937.                     }    
  938.                     searchnum++;
  939.                 } 
  940.                 fclose( fp );
  941.                 fclose( newfp );
  942.         } else {
  943.             if( fp != NULL )
  944.                 fclose( fp );
  945.             else
  946.                 fclose( newfp );
  947.             puterror( "新ファイル作成に失敗しました" );
  948.             MOS_loop();
  949.             return;
  950.         }    
  951.         
  952.         putmessage( "新ファイルを作成しました" );
  953.         MOS_loop();
  954.     
  955.     } else {
  956.         fclose( fp );
  957.         puterror( "同一ファイル名が存在します" );
  958.         MOS_loop();
  959.         putmessage( "新データ名を変更してください" );    
  960.         MOS_loop();
  961.         return;
  962.     }
  963. }
  964.  
  965.  
  966. void    fshinki()
  967. {
  968.     char    newdataname[128];
  969.     char    pathname[64];
  970.     char    num[9][3] = { {"1"},{"2"},{"3"},{"4"},{"5"},{"6"},{"7"},{"8"},{"9"} };
  971.     
  972.     short    mojilen = 1;
  973.     short    i;
  974.     short    oakret;
  975.     FILE    *fp;
  976.     
  977.     strcpy(swork, "データの新規登録");
  978.     g_wintitle(5, 30, 5,  TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON);
  979.     g_winbox(5, 6, 30, 22, BOXCOL, UBXCOL, DBXCOL);
  980.     g_put_endicn( 6, 20.5 );
  981.     
  982.     /*  データ名の入力  */
  983.     strcpy(swork, "データ名");
  984.     g_putchr(6, 7, CHRCOL, swork);
  985.     oakret = oakn(11, 7, 29, 1, newdataname );
  986.     g_boxfill( 11, 7 - 0.5, 29, 7 + 1.5, BOXCOL ); 
  987.     g_putchr2( 11, 7, CHRCOL, newdataname, 40 );
  988.     
  989.     if( oakret == BREAK ){
  990.         g_rput_endicn( 6, 20.5 );
  991.         putmessage( "データファイル作成を中止します" );
  992.         return;
  993.     }
  994.     
  995.     if( strlen( newdataname ) == 0 ){
  996.         puterror( "データ名が入力されませんでした" );
  997.         return;
  998.     }
  999.     
  1000.     makepath( pathname );
  1001.     strcat( pathname, "FILENAME.CRD" );
  1002.     if( ( fp = fopen( pathname,"r" ) ) != NULL ){
  1003.         while( fgetx( fwork, 8192, fp ) ){
  1004.             if( strncmp( newdataname, fwork, 8 ) == 0 ){
  1005.                 puterror( "同一ファイル名が存在します" );
  1006.                 fclose( fp );
  1007.                 return;
  1008.             }
  1009.         }    
  1010.         fclose( fp );
  1011.     } else {
  1012.         puterror( "設定ファイル名のオープンに失敗しました" );
  1013.         return;
  1014.     }
  1015.         
  1016.     
  1017.     
  1018.     /*  項目名の入力  */
  1019.     for(i = 0; (i <= 5) && (mojilen > 0) && (oakret == THRU); i++){
  1020.         strcpy(swork, "項目名");
  1021.         strcat(swork, num[i]);
  1022.         g_putchr(7, (9 + i*2), CHRCOL, swork);
  1023.         oakret = oakn(11, (9 + i*2), 29, 1, &komdata[i][0]);
  1024.         g_boxfill( 11, ( 9 + i * 2 ) - 0.5, 29, ( ( 9 + i * 2 ) + 1.5 ), BOXCOL ); 
  1025.         g_putchr2( 11, ( 9 + i * 2 ), CHRCOL, komdata[ i ], 38 );
  1026.         mojilen = strlen( &komdata[i][0] );
  1027.     }
  1028.     
  1029.     if( oakret == BREAK ){
  1030.         g_rput_endicn( 6, 20.5 );
  1031.         putmessage( "データファイル作成を中止します" );
  1032.         return;
  1033.     }
  1034.     
  1035.     /*  BOXの消去  */
  1036.     if(mojilen == 0){
  1037.         komsize = --i;
  1038.         WORD(para + 0) = 6 * 16;
  1039.         WORD(para + 2) = (9 + i*2) * 16 - 8;
  1040.         WORD(para + 4) = (29 + 1) * 16;
  1041.         WORD(para + 6) = (10 + i*2) * 16 + 8;
  1042.         EGB_color( work, 0, BOXCOL );
  1043.         EGB_color( work, 2, BOXCOL );
  1044.         EGB_rectangle(work, para);
  1045.     }else 
  1046.         komsize = i;
  1047.     
  1048.     if( komsize == 0 ){
  1049.         puterror( "項目名を一つも入力していません" );
  1050.         MOS_loop();
  1051.         return;
  1052.     }
  1053.         
  1054.     putmessage( "新規データ登録中" );
  1055.     
  1056.     /*  ファイルのオープン1 */
  1057.     makepath( pathname );
  1058.     strcat( pathname, "FILENAME.CRD" );
  1059.     if( ( fp = fopen( pathname,"a" ) ) != NULL ){
  1060.         fputx( newdataname, fp );
  1061.         fclose( fp );
  1062.     } else {
  1063.         puterror( "新規ファイル名の保存に失敗しました" );
  1064.         MOS_loop();
  1065.     }    
  1066.     
  1067.     /*  ファイルのオープン2 */
  1068.     if( ( fp = fopen_kom( newdataname, "w" ) ) != NULL ){
  1069.         for( i = 1; i <= komsize; i++ )
  1070.             fputx( komdata[i - 1], fp );
  1071.         fclose( fp );
  1072.     } else {
  1073.         puterror( "項目ファイルの作成に失敗しました" );
  1074.         MOS_loop();
  1075.     }    
  1076.     
  1077.     /*  ファイルのオープン3 */
  1078.     if( ( fp = fopen_crd( newdataname, "w" ) ) != NULL )
  1079.         fclose( fp );
  1080.     else {
  1081.         puterror( "データファイルの作成に失敗しました" );
  1082.         MOS_loop();
  1083.     }    
  1084. }
  1085.  
  1086. void    fsakujyo()
  1087. {
  1088.     char    del_dataname[128];
  1089.     char    read_dataname[128]; 
  1090.     char    new_filename[128];
  1091.     FILE    *newfp;
  1092.     char    old_filename[128];
  1093.     FILE    *oldfp;
  1094.     char    tmp_filename[128];
  1095.     char    del_filename[128];
  1096.     
  1097.     putmessage( "削除するデータファイルを選んでください" );
  1098.     
  1099.     strcpy( del_dataname, selfile() );
  1100.     if( strcmp( del_dataname, "データファイル名") == 0 ){
  1101.         putmessage( "データファイル削除を中止します" );
  1102.         return;
  1103.     }
  1104.         
  1105.     strcpy( swork, "データファイル(" );
  1106.     strcat( swork, del_dataname );
  1107.     strcat(    swork, ")を削除しますか?" );
  1108.     putmessage( swork );
  1109.     
  1110.     if( MOS_YesNo() == 1 ){
  1111.         
  1112.         makepath( tmp_filename );
  1113.         strcat( tmp_filename, "FILENAME.CRD" );
  1114.     
  1115.         makepath( old_filename );
  1116.         strcat( old_filename, "FILENAME.CRO" );
  1117.     
  1118.         if( rename( tmp_filename, old_filename) == 0){
  1119.             strcpy(new_filename, tmp_filename);
  1120.             if( ( oldfp = fopen( old_filename, "r" ) ) != NULL &&
  1121.                 ( newfp = fopen( new_filename, "w" ) ) != NULL ){
  1122.             
  1123.                 while( fgetx( read_dataname, 128, oldfp ) != NULL ){
  1124.                     if( strcmp( read_dataname, del_dataname ) )
  1125.                         fputx( read_dataname, newfp );
  1126.                 }
  1127.                 fclose( oldfp );
  1128.                 fclose( newfp );
  1129.                 
  1130.                 remove( old_filename );
  1131.                 
  1132.                 makepath( del_filename );
  1133.                 makefilename( del_filename, del_dataname );
  1134.                 strcat( del_filename, ".KOM" );
  1135.                 remove( del_filename );
  1136.                 
  1137.                 makepath( del_filename );
  1138.                 makefilename( del_filename, del_dataname );
  1139.                 strcat( del_filename, ".CRD" );
  1140.                 remove( del_filename );
  1141.                 
  1142.                 strcpy( swork, "データファイル(" );
  1143.                 strcat( swork, del_dataname );
  1144.                 strcat(    swork, ")を削除しました" );
  1145.                 putmessage( swork );
  1146.                 MOS_loop();
  1147.             
  1148.             } else {
  1149.                 puterror( "データファイルの削除に失敗しました" );
  1150.                 MOS_loop();
  1151.             }
  1152.         } else {
  1153.             puterror( "データファイルの削除に失敗しました" );
  1154.             MOS_loop();
  1155.         }    
  1156.     }
  1157. }
  1158.  
  1159. short     selmode(FILE *fp, char *filename )
  1160. {
  1161.     short    ret;
  1162.     char    msg[4][20] =  {"Command", "データ追加", "データ検索", "データ閲覧終了" };
  1163.     
  1164.     ret = MOS_read( 27.5, 3.5, 3, msg[0], 20, page1, NEW );
  1165.  
  1166.     switch(ret){
  1167.         case 1:    fclose( fp );
  1168.                 dtuika( filename );
  1169.                 fp = fopen_crd( filename, "r" );
  1170.                 break;
  1171.         case 2:    fclose( fp );
  1172.                 dkensaku( filename );
  1173.                 fp = fopen_crd( filename, "r" );
  1174.                 break;
  1175.         default:
  1176.                 break;
  1177.     }
  1178.  
  1179.     return    ret;
  1180. }
  1181.  
  1182. short     selmode2(FILE *fp, char *filename, short cardnum )
  1183. {
  1184.     char    msg[5][20] =  {"Command", "データ追加", "データ修正", 
  1185.                            "データ削除", "データ一覧" };
  1186.     short    ret;
  1187.     short    tret;
  1188.     short    delret;
  1189.     
  1190.     ret = MOS_read(27.5, 3.5, 4, msg[0], 20, page1, NEW );
  1191.  
  1192.     switch(ret){
  1193.         case 1:    fclose(fp);
  1194.                 tret = dtuika(filename);
  1195.                 fp = fopen_crd( filename, "r" );
  1196.                 break;                    
  1197.         case 2:    fclose(fp);
  1198.                 dsyusei(filename, cardnum, &carddata[0][0]);
  1199.                 fp = fopen_crd( filename, "r" );
  1200.                 break;
  1201.         case 3:    fclose( fp );
  1202.                 delret = dsakujyo(filename, cardnum);
  1203.                 if( delret == BREAK )
  1204.                     ret = 2;
  1205.                 fp = fopen_crd( filename, "r" );
  1206.                 break;
  1207.         default:
  1208.                 break;
  1209.     }
  1210.     
  1211.     if( ret == 1 && tret == BREAK )
  1212.         ret = 2;
  1213.     
  1214.     if( ret != Rbotton ){    
  1215.         maketitle( filename, swork, "・一覧モード" );
  1216.         g_wintitle( 1, 38, 1,  TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1217.     }
  1218.     
  1219.     return    ret;
  1220. }
  1221.  
  1222. short    selmode_k( FILE *fp, char *filename, short searsize, short *searchnum )
  1223. {
  1224.     char    msg[3][20] =  {"Command",  "別ファイル作成",  "検索モード終了"};
  1225.     short    ret;
  1226.     
  1227.     ret = MOS_read( 27.5, 3.5, 2, msg[0], 20, page1, NEW );
  1228.  
  1229.     switch(ret){
  1230.         case 1:    fclose( fp );
  1231.                 make_newfile( filename, searsize, searchnum, datalen );
  1232.                 fp = fopen_crd( filename, "r" );
  1233.                 break;
  1234.         default:
  1235.                 break;
  1236.     }
  1237.     
  1238.     maketitle( filename, swork, "・検索モード" );
  1239.     g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1240.  
  1241.     return    ret;
  1242. }
  1243.  
  1244. short     selmode_k2(FILE *fp, char *filename, short cardnum )
  1245. {
  1246.     char    msg[4][20] =  {"Command", "データ修正", "データ削除", "データ一覧"};
  1247.     short    ret;
  1248.     short    delret;
  1249.     
  1250.     ret = MOS_read(27.5, 3.5, 3, msg[0], 20, page1, NEW );
  1251.  
  1252.     switch(ret){
  1253.         case 1:    fclose( fp );
  1254.                 dsyusei( filename, cardnum, &carddata[0][0] );
  1255.                 fp = fopen_crd( filename, "r" );
  1256.                 break;
  1257.         case 2:    fclose( fp );
  1258.                 delret = dsakujyo( filename, cardnum );
  1259.                 if( delret == BREAK )
  1260.                     ret = 1;
  1261.                 fp = fopen_crd( filename, "r" );
  1262.                 break;
  1263.         default:
  1264.                 break;
  1265.     }
  1266.     
  1267.     maketitle( filename, swork, "・検索モード" );
  1268.     g_wintitle( 1, 38, 1,  TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1269.  
  1270.     return    ret;
  1271. }
  1272.  
  1273. short    dtuika(char *filename)
  1274. {
  1275.     char    newdata[6][1024];
  1276.     short    i, mojilen;
  1277.     int        oakret = 0;
  1278.     FILE    *fp;
  1279.     
  1280.     maketitle( filename, swork, "・追加モード" );
  1281.     g_wintitle( 1, 38, 1,  TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1282.     g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  1283.     g_put_endicn( 2, 26 );
  1284.  
  1285.     for(i = 0; i <= (komsize - 1); i++)
  1286.         put_komdata( &komdata[ i ][ 0 ], i + 1 );
  1287.     
  1288.     for( i = 0; i <= (komsize - 1) && ( oakret == THRU ); i++ ){
  1289.         oakret = oakn( 12, (3 + i * putysize), 37, putysize, newdata[i] );
  1290.         g_boxfill( 12, ( 3 + i * putysize ) - 0.25, 37.5, ( ( 3 + i * putysize ) + ( putysize - 1 ) + 0.25 ), BOXCOL ); 
  1291.         if( i > 0 )    
  1292.             put_carddata( &newdata[ i - 1 ][ 0 ], i);
  1293.         put_carddata( &newdata[ i ][ 0 ], i + 1 );
  1294.     }
  1295.     if( oakret == BREAK ){
  1296.         g_rput_endicn( 2, 26 );
  1297.         putmessage( "データ追加を中止します" );
  1298.         MOS_loop();
  1299.         return BREAK;
  1300.     }
  1301.     
  1302.     putmessage( "データ追加作業中" );
  1303.     
  1304.     /* 入力データを全引用付形式に変換してファイルに保存 */
  1305.     if( ( fp = fopen_crd( filename, "a" ) ) != NULL ){
  1306.         *(fwork + 0) = (char)0x22;
  1307.         *(fwork + 1) = (char)0x00;
  1308.         for(i = 0; i <= (komsize - 1); i++){
  1309.             strcat(fwork, newdata[i]);
  1310.             mojilen = strlen(fwork);
  1311.             *(fwork + mojilen) = (char)0x22;
  1312.             if(i < (komsize - 1)){
  1313.                 *(fwork + mojilen + 1) = (char)0x2c;
  1314.                 *(fwork + mojilen + 2) = (char)0x22;
  1315.                 *(fwork + mojilen + 3) = (char)0x00;
  1316.             }else
  1317.                 *(fwork + mojilen + 1) = (char)0x00;
  1318.         }
  1319.         fputx(fwork, fp);
  1320.         fclose(fp);
  1321.         
  1322.         cardsize++;
  1323.         datalen[ cardsize ] = strlen( fwork ) + 2;
  1324.         
  1325.         putmessage( "入力データを登録しました" );
  1326.         MOS_loop();
  1327.         return THRU;
  1328.     } else {
  1329.         puterror( "入力データのファイルへの保存に失敗しました" );
  1330.         MOS_loop();
  1331.         return BREAK;
  1332.     }
  1333.     
  1334. }
  1335.  
  1336. void    dsyusei(char *filename, short cardnum, char *olddata)
  1337. {
  1338.     char    newdata[6][1024];
  1339.     short    hennum;
  1340.     short    i, mojilen;
  1341.     char    putdata[8192];
  1342.     char    old_filenam[64];
  1343.     FILE    *oldfp;
  1344.     char    new_filenam[64];
  1345.     FILE    *newfp;
  1346.     char    tmp_filename[64];
  1347.     short    readnum;
  1348.     int        cmp;
  1349.     short    oakret = 0;
  1350.     
  1351.     for( i = 0; i <= (komsize - 1); i++ )
  1352.         strcpy( newdata[ i ], olddata + ( i * 1024 ) );
  1353.     
  1354.     maketitle( filename, swork, "・No." );
  1355.     makeNo( cardnum, swork );
  1356.     strcat( swork, " - 修正モード" );
  1357.     g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1358.     g_winbox(1, 2, 38, 28, BOXCOL, UBXCOL, DBXCOL);
  1359.     g_put_endicn( 2, 26 );
  1360.     
  1361.     for( i = 1; i <= komsize; i++ ){                
  1362.         put_komdata( &komdata[ i - 1 ][ 0 ], i ); 
  1363.         put_carddata( olddata + ( i - 1 ) * 1024, i ); 
  1364.     }
  1365.  
  1366.     for( i = 0; i <= (komsize - 1) && ( oakret == THRU ); i++ ){
  1367.         oakret = oaks( 12, (3 + i * putysize), 37, putysize, newdata[i] );
  1368.         g_boxfill(12, ( 3 + i * putysize ) - 0.25, 37.5, ( ( 3 + i * putysize ) + (putysize - 1 ) + 0.25 ), BOXCOL); 
  1369.         if( i > 0 )    
  1370.             put_carddata( &newdata[ i - 1 ][ 0 ], i);
  1371.         put_carddata( &newdata[ i ][ 0 ], i + 1);
  1372.     }
  1373.     
  1374.     if( oakret == BREAK ){
  1375.         g_rput_endicn( 2, 26 );
  1376.         putmessage( "データ修正を中止します" );
  1377.         MOS_loop();
  1378.         return;
  1379.     }
  1380.     
  1381.     hennum = 0;
  1382.     for( i = 0; i <= (komsize - 1); i++ ){
  1383.         cmp = strcmp( newdata[ i ], olddata + ( i * 1024 ) );
  1384.         if( cmp != 0 )
  1385.             hennum++;    
  1386.     }
  1387.     if( hennum == 0 ){
  1388.         puterror( "データが変更されていません" );                                            
  1389.         MOS_loop();
  1390.         return;
  1391.     }
  1392.     
  1393.     putmessage( "データ修正作業中" );
  1394.     
  1395.     /* 入力データを全引用付形式に変換 */
  1396.     
  1397.     *( putdata + 0 ) = ( char )0x22;
  1398.     *( putdata + 1 ) = ( char )0x00;
  1399.     for( i = 0; i <= ( komsize - 1 ); i++ ){
  1400.         strcat( putdata, newdata[ i ] );
  1401.         mojilen = strlen( putdata );
  1402.         *( putdata + mojilen ) = ( char )0x22;
  1403.         if( i < (komsize - 1) ){
  1404.             *( putdata + mojilen + 1 ) = ( char )0x2c;
  1405.             *( putdata + mojilen + 2 ) = ( char )0x22;
  1406.             *( putdata + mojilen + 3 ) = ( char )0x00;
  1407.         }else
  1408.             *( putdata + mojilen + 1 ) = ( char )0x00;
  1409.     }
  1410.  
  1411.     /* ファイルに保存 */
  1412.     
  1413.     makepath( tmp_filename );
  1414.     strncat( tmp_filename, filename, 8 );
  1415.     strcat( tmp_filename, ".CRD" );
  1416.     
  1417.     makepath( old_filenam );
  1418.     strncat( old_filenam, filename, 8 );
  1419.     strcat( old_filenam, ".CRO" );
  1420.     
  1421.     if( rename( tmp_filename, old_filenam) == 0){
  1422.         readnum = 1;
  1423.         strcpy(new_filenam, tmp_filename);
  1424.         if( ( oldfp = fopen( old_filenam, "r" ) ) != NULL &&
  1425.             ( newfp = fopen( new_filenam, "w" ) ) != NULL ){
  1426.             
  1427.             while( fgetx( fwork, 8192, oldfp ) != NULL ){
  1428.                 if( cardnum == readnum )
  1429.                     fputx( putdata, newfp );
  1430.                 else    
  1431.                     fputx( fwork, newfp );
  1432.                 readnum++;
  1433.             }
  1434.             fclose( oldfp );
  1435.             fclose( newfp );
  1436.             remove( old_filenam );
  1437.             
  1438.             datalen[ cardnum ] = strlen( putdata ) + 2;
  1439.             
  1440.             putmessage( "データを修正しました" );
  1441.             MOS_loop();
  1442.             
  1443.         } else {
  1444.             puterror( "データの修正に失敗しました" );
  1445.             MOS_loop();
  1446.         }
  1447.     } else {
  1448.         puterror( "データの修正に失敗しました" );
  1449.         MOS_loop();
  1450.     }    
  1451. }
  1452.  
  1453.  
  1454. short    dsakujyo( char *filename, short cardnum )
  1455. {
  1456.     FILE    *oldfp;
  1457.     char    old_filenam[128];
  1458.     FILE    *newfp;
  1459.     char    new_filenam[128];
  1460.     char    tmp_filename[128];
  1461.     short    readnum;
  1462.     short    ret;
  1463.         
  1464.     putmessage( "このデータを削除しますか?" );
  1465.     ret = MOS_YesNo();
  1466.     
  1467.     if( ret == 1 ){
  1468.         maketitle( filename, swork, "・削除モード" );
  1469.         g_wintitle( 1, 38, 1, TITCOL, UTICOL, DTICOL, TCHCOL, swork, page0, SOUND_ON );
  1470.         putmessage( "データ削除作業中" );
  1471.  
  1472.         /* ファイルのデータを削除 */
  1473.     
  1474.         makepath( tmp_filename );
  1475.         strncat( tmp_filename, filename, 8 );
  1476.         strcat( tmp_filename, ".CRD" );
  1477.     
  1478.         makepath( old_filenam );
  1479.         strncat( old_filenam, filename, 8 );
  1480.         strcat( old_filenam, ".CRO" );
  1481.     
  1482.         if( rename( tmp_filename, old_filenam) == 0){
  1483.             readnum = 1;
  1484.             strcpy(new_filenam, tmp_filename);
  1485.             if( ( oldfp = fopen( old_filenam, "r" ) ) != NULL &&
  1486.                 ( newfp = fopen( new_filenam, "w" ) ) != NULL ){
  1487.             
  1488.                 while( fgetx( fwork, 8192, oldfp ) != NULL ){
  1489.                     if( cardnum != readnum )
  1490.                         fputx( fwork, newfp );
  1491.                     readnum++;
  1492.                 }
  1493.                 
  1494.                 fclose( oldfp );
  1495.                 fclose( newfp );
  1496.                 remove( old_filenam );
  1497.         
  1498.                 cardsize--;
  1499.                 memcpy( &datalen[ cardnum ], &datalen[ cardnum + 1], (1000 - cardnum ) * 2 );
  1500.                 
  1501.                 putmessage( "データを削除しました" );
  1502.                 MOS_loop();
  1503.             } else {
  1504.                 puterror( "データの削除に失敗しました" );
  1505.                 MOS_loop();
  1506.             }
  1507.         } else {
  1508.             puterror( "データの削除に失敗しました" );
  1509.             MOS_loop();
  1510.         }    
  1511.         return    THRU;
  1512.     } else {
  1513.         putmessage( "データを削除しません" );
  1514.         MOS_loop();
  1515.         return    BREAK;
  1516.     }    
  1517. }
  1518.  
  1519.     
  1520.  
  1521. char    *selfile()
  1522. {
  1523.     char    filename[25][128];
  1524.     char    selfilename[25][32];
  1525.     char    pathname[128];
  1526.     short    filenum, i;
  1527.     FILE    *fp;
  1528.     short    ret;
  1529.  
  1530.     strcpy( filename[0], "データファイル名" );
  1531.     strcpy( selfilename[0], "データファイル名" );
  1532.     
  1533.     makepath( pathname );
  1534.     strcat( pathname, "FILENAME.CRD" );
  1535.     if( ( fp = fopen( pathname, "r" ) ) != NULL ){
  1536.         for( i = 1; fgetx( filename[ i ], 128, fp ) != NULL; i++ )
  1537.             strncpy( selfilename[ i ], filename[ i ], 30 );
  1538.         filenum = i - 1;
  1539.         fclose( fp );
  1540.     }else {
  1541.         strcpy( swork, "ファイル(" );
  1542.         strcat( swork, pathname );
  1543.         strcat( swork , ")がオープンできません" );
  1544.         puterror( swork );
  1545.         MOS_loop();
  1546.         main2();
  1547.     }
  1548.  
  1549.     if( filenum > 0 ){
  1550.         ret = MOS_read(5, 5, filenum, selfilename[0], 32, page0, NEW );
  1551.         if( ret < 0 )
  1552.             ret = 0;
  1553.     } else {
  1554.         puterror( "データファイルが一つもありません" );
  1555.         MOS_loop();
  1556.         ret = 0;
  1557.     }
  1558.     
  1559.         
  1560.     return    filename[ret];
  1561. }
  1562.  
  1563.  
  1564.  
  1565. void    init()
  1566. {
  1567.     FILE    *fp;
  1568.     char    *env;
  1569.     short    ret;
  1570.     char    bankname[8];
  1571.     
  1572.     SND_init( sndwork );
  1573.     SND_elevol_init();
  1574.     SND_elevol_mute( 3 );
  1575.         
  1576.     EGB_init( work, 1536 );
  1577.     EGB_resolution( work, 0, 0x43 ) ;
  1578.     EGB_resolution( work, 1, 0x43 ) ;
  1579.     EGB_displayPage( work, 1, 3 );
  1580.     EGB_paintMode( work, 0x22 );
  1581.     WORD( para + 0 ) = 0;
  1582.     WORD( para + 2 ) = 0;
  1583.     WORD( para + 4 ) = 639;
  1584.     WORD( para + 6 ) = 479;
  1585.     EGB_color( work, 0, BAKCOL );
  1586.     EGB_color( work, 2, BAKCOL );
  1587.     EGB_rectangle( work, para );
  1588.     
  1589.     soundflag = OFF;
  1590.     putmessage( "FM音源データファイルを読み込みます" );
  1591.     if( SND_fm_bank_load( "q:\\fj\\fm\\fmp_hard.fmb", bankname ) )
  1592.         puterror( "FM音源データファイルが見当たりません" );
  1593.     else
  1594.         soundflag = ON;
  1595.         
  1596.     if( ( env = getenv( "DABE" ) ) != NULL ){
  1597.         strcpy( swork, "環境変数は" );
  1598.         strcat( swork, env );
  1599.         strcat( swork, "に設定されてます" );
  1600.         putmessage( swork );
  1601.         strcpy( fenv, env );
  1602.     } else {
  1603.         putmessage( "環境変数は設定されていません" );
  1604.         strcpy( fenv, "a:" );
  1605.     }
  1606.     strcat( fenv, "\\FILESTAT.DAT" ); 
  1607.     
  1608.     putmessage( "環境設定ファイルを読み込みます" );
  1609.     if( ( fp = fopen( fenv, "r" ) ) != NULL ){
  1610.         fgetx( drive, 4, fp );
  1611.         fgetx( path, 32, fp );
  1612.         strcpy( swork, "ドライブ" );
  1613.         strcat( swork, drive );
  1614.         strcat( swork, "、パス" );
  1615.         strcat( swork, path );
  1616.         strcat( swork, "に設定されています" );
  1617.         putmessage( swork );
  1618.         fclose( fp );
  1619.     } else {
  1620.         puterror( "環境設定ファイルが見つかりません" );
  1621.         MOS_loop();
  1622.         putmessage( "環境設定ファイルを作成しますか?" );
  1623.         ret = MOS_YesNo();
  1624.         if( ret == 1 ){
  1625.             strcpy( drive, "a:" );
  1626.             strcpy( path, "\\" );
  1627.             if( ( fp = fopen( fenv, "w" ) ) != NULL ){
  1628.                 fputx( drive, fp );
  1629.                 fputx( path, fp );
  1630.                 fclose( fp );
  1631.                 strcpy( swork, "環境設定ファイル(" );
  1632.                 strcat( swork, fenv );
  1633.                 strcat( swork, ")を、A:¥に作成しました" );
  1634.                 putmessage( swork );
  1635.             }else 
  1636.                 puterror( "環境設定ファイルの作成に失敗しました" );
  1637.         } else {
  1638.             putmessage( "環境変数を設定し直し再起動してください" );
  1639.             MOS_loop();
  1640.             puterror( "ドライブ、パス名が未設定です" );
  1641.         }
  1642.     }             
  1643.     
  1644.     return;    
  1645.     
  1646. }
  1647.  
  1648. void    end()
  1649. {    
  1650.     putmessage( "終了します" );
  1651.     
  1652.     SND_elevol_mute( 0 );
  1653.     SND_end();
  1654.     exit( 1 );
  1655. }
  1656.  
  1657. short oakn(short x1, short y1, short x2, short line, char *sret) /* oakで入力 */
  1658. {
  1659.     /************************************************************************/
  1660.     /* i x1 == 入力領域の開始x座標(16ドット単位)                        */
  1661.     /* i x2 == 入力領域の終了x座標(16ドット単位)                        */
  1662.     /* i y1 == 入力領域の開始y座標(16ドット単位)                        */
  1663.     /* i x2 == 入力領域の終了y座標(16ドット単位)                        */
  1664.     /* c *sret == 入力された文字を返す領域のアドレス                        */
  1665.     /************************************************************************/
  1666.     
  1667.     char    ch;
  1668.     
  1669.     g_wintitle(32.5, 38.5, 27.5,  TITCOL, UTICOL, DTICOL, TCHCOL, "oak", page0, SOUND_OFF );
  1670.     
  1671.     init_charmap();
  1672.     KYB_clrbuf();
  1673.     
  1674.        cmwork( mwork ); 
  1675.     MOS_start( mwork, 4096 );
  1676.     MOS_resolution( 1, 3 );
  1677.     MOS_horizon( 0, 639 );
  1678.     MOS_vertical( 0, 479 );
  1679.     MOS_setpos( ox, oy );
  1680.     getcurbak( ox, oy );
  1681.     putcur( ox, oy );
  1682.     
  1683.     wind(x1*16, y1*16-3, x2*16+3, (y1 + line)*16+4,    CHRCOL, BOAKCOL, COAKCOL, 8, 17, 0x00);
  1684.     KAN_open( putstr,putsys,putmode);
  1685.  
  1686.     while ( (ch = getch()) != CR && ch != ESC ) {
  1687.         putch(ch);
  1688.         cflush();
  1689.     } 
  1690.     cur_dsp(1);
  1691.     
  1692.     KAN_close();
  1693.     
  1694.     putcurbak( ox, oy );
  1695.     MOS_end();
  1696.  
  1697.     getstr( sret );
  1698.  
  1699.     if( ch == CR )
  1700.         return    THRU;
  1701.     else {
  1702.         g_rput_endicn( event1_x, event1_y );
  1703.         return  BREAK;    
  1704.     }
  1705. }
  1706.  
  1707. short oaks(short x1, short y1, short x2, short line, char *sret) /* oakで入力 */
  1708. {
  1709.     /************************************************************************/
  1710.     /* i x1 == 入力領域の開始x座標(16ドット単位)                        */
  1711.     /* i x2 == 入力領域の終了x座標(16ドット単位)                        */
  1712.     /* i y1 == 入力領域の開始y座標(16ドット単位)                        */
  1713.     /* i x2 == 入力領域の終了y座標(16ドット単位)                        */
  1714.     /* c *sret == 入力された文字を返す領域のアドレス                        */
  1715.     /************************************************************************/
  1716.     
  1717.     char    ch;
  1718.     char    *psr = sret;
  1719.     
  1720.     g_wintitle(32.5, 38.5, 27.5,  TITCOL, UTICOL, DTICOL, TCHCOL, "oak", page0, SOUND_OFF );
  1721.     
  1722.     init_charmap();
  1723.     KYB_clrbuf();
  1724.     
  1725.        cmwork( mwork ); 
  1726.     MOS_start( mwork, 4096 );
  1727.     MOS_horizon( 0, 639 );
  1728.     MOS_vertical( 0, 479 );
  1729.     MOS_setpos( ox, oy );
  1730.     getcurbak( ox, oy );
  1731.     putcur( ox, oy );
  1732.     
  1733.     wind(x1*16, y1*16-3, x2*16+3, (y1 + line)*16+4,    CHRCOL, BOAKCOL, COAKCOL, 8, 17, 0x00);
  1734.     KAN_open(putstr,putsys,putmode);
  1735.  
  1736.     if( INS_STAT == ON ){
  1737.         INS_STAT = OFF;
  1738.         while ( *psr != 0x00 ) {
  1739.             putch( *psr );
  1740.             cflush();
  1741.             psr++;
  1742.         } 
  1743.         INS_STAT = ON;
  1744.     } else {    
  1745.         while ( *psr != 0x00 ) {
  1746.             putch( *psr );
  1747.             cflush();
  1748.                 psr++;
  1749.         } 
  1750.     }
  1751.     
  1752.     while ( (ch = getch()) != CR && ch != ESC ) {
  1753.         putch(ch);
  1754.         cflush();
  1755.     } 
  1756.     
  1757.     cur_dsp(1);
  1758.     
  1759.     KAN_close();
  1760.     
  1761.     putcurbak( ox, oy );
  1762.     MOS_end();
  1763.     
  1764.  
  1765.     getstr( sret );
  1766.     
  1767.     if( ch == CR )
  1768.         return    THRU;
  1769.     else{
  1770.         g_rput_endicn( event1_x, event1_y );
  1771.         return  BREAK;    
  1772.     }
  1773. }
  1774.  
  1775. short    put_oakcur()
  1776. {
  1777.        int        ch, x, y;    
  1778.        
  1779.        MOS_rdpos( &ch, &x, &y );
  1780.     
  1781.     if( ( x != ox ) || ( y != oy ) ){    
  1782.         putcurbak( ox, oy );
  1783.         getcurbak( x, y );
  1784.         putcur( x, y );
  1785.     }
  1786.     ox = x;
  1787.     oy = y;
  1788.  
  1789.     if( (ch == 1) && (x >= event1_x) && (x <= (event1_x + 31)) && (y >= event1_y) && (y <= (event1_y + 31)) ){         
  1790.         BPB_freeon2( 10, 1500 );
  1791.         return    1; 
  1792.     } else 
  1793.         return    0;
  1794.         
  1795. }
  1796.  
  1797.  
  1798. void    maketitle( char *filename, char *str, char *mode )
  1799. {
  1800.     strcpy( str, filename );
  1801.     strcat( str, "(" );
  1802.     strcat( str, drive );
  1803.     strcat( str, path );
  1804.     strcat( str, ")" );
  1805.     strcat( str, mode );
  1806. }
  1807.  
  1808. void    makeNo( short number, char *str )
  1809. {
  1810.     char    num[10][3] = { {"0"},{"1"},{"2"},{"3"},{"4"},{"5"},{"6"},{"7"},{"8"},{"9"} };
  1811.     short    subnum;
  1812.     short    floornum;
  1813.     short    charflag;
  1814.     
  1815.     charflag = OFF;
  1816.     subnum = 1000;
  1817.     while( subnum >= 1){
  1818.         floornum = floor( number / subnum );
  1819.         if( floornum > 0 || ( floornum == 0 && charflag == ON ) ){
  1820.             charflag = ON;
  1821.             strcat( str, num[ floornum ] );
  1822.         }
  1823.         number -= floornum * subnum;
  1824.         subnum /= 10;    
  1825.     }
  1826.     
  1827. }
  1828.  
  1829.